package ar.edu.utn.frgp.labtec.dao;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import ar.edu.utn.frgp.labtec.constants.DBParametersConstants;
import ar.edu.utn.frgp.labtec.entities.EstadoEnum;
import ar.edu.utn.frgp.labtec.entities.Laboratorio;

public class LaboratorioDao extends DefaultGenericDao implements
		GenericDao<Laboratorio> {

	public void create(Laboratorio obj) {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();

		session.save(obj);

	}

	public void update(Laboratorio obj) {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();

		session.update(obj);

	}

	public void delete(Laboratorio obj) {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();
		obj.setEstado(EstadoEnum.I);
		session.update(obj);

	}

	@SuppressWarnings("unchecked")
	public List<Laboratorio> getAll() {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();

		Criteria criteria = session.createCriteria(Laboratorio.class);
		criteria.add(Restrictions.eq(DBParametersConstants.ESTADO,
				EstadoEnum.H));
		criteria.addOrder( Order.asc(DBParametersConstants.DEPARTAMENTO_CODE_DPTO) );

		return (List<Laboratorio>) criteria.list();
	}

	public Laboratorio getLaboratorio(Integer codLab, String codDpto) {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();

		Criteria criteria = session.createCriteria(Laboratorio.class);
		criteria.add(Restrictions.eq(DBParametersConstants.CODE_LAB, codLab));
		criteria.add(Restrictions.eq(
				DBParametersConstants.DEPARTAMENTO_CODE_DPTO, codDpto));

		Laboratorio laboratorio = (Laboratorio) criteria.uniqueResult();
		return laboratorio;
	}

	@SuppressWarnings("unchecked")
	public List<Laboratorio> getLaboratorioXdepto(String codDepto) {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();

		Criteria criteria = session.createCriteria(Laboratorio.class);
		criteria.add(Restrictions.eq(
				DBParametersConstants.DEPARTAMENTO_CODE_DPTO, codDepto));
		criteria.add(Restrictions.eq(DBParametersConstants.ESTADO,
				EstadoEnum.H));

		return (List<Laboratorio>) criteria.list();

	}

	public Integer getMaxCodeLaboratorio(String codDepto) {
		Session session = hibernateTemplate.getSessionFactory()
				.getCurrentSession();

		Criteria criteria = session.createCriteria(Laboratorio.class)
				.setProjection(Projections.max(DBParametersConstants.CODE_LAB));
		criteria.add(Restrictions.eq(
				DBParametersConstants.DEPARTAMENTO_CODE_DPTO, codDepto));
		return (Integer) criteria.uniqueResult();

	}

}
